# 导入所需的库
import pymysql  # MySQL数据库连接库
from movie_dao import MovieDAO  # 导入电影数据访问对象
import logging  # 日志模块

# 配置日志系统
logging.basicConfig(level=logging.INFO,  # 设置日志级别为INFO
                   format='%(asctime)s - %(levelname)s - %(message)s')  # 设置日志格式：时间-级别-消息
logger = logging.getLogger(__name__)  # 获取当前模块的日志记录器

class StatsDAO:
    """统计数据访问对象，用于获取电影相关的统计信息"""
    
    def __init__(self):
        """初始化统计DAO对象"""
        self.movie_dao = MovieDAO()  # 创建电影DAO实例用于数据库连接
        # 定义默认统计数据，当数据库查询失败时返回
        self.default_stats = {
            'total_movies': 250,  # 默认电影总数
            'avg_rating': 8.9,  # 默认平均评分
            'total_countries': 30,  # 默认国家/地区数
            'total_directors': 150  # 默认导演数量
        }

    def get_stats(self):
        """获取所有统计数据的主方法"""
        conn = None  # 数据库连接对象
        cursor = None  # 数据库游标对象
        try:
            conn = self.movie_dao.get_connection()  # 获取数据库连接
            cursor = conn.cursor(pymysql.cursors.DictCursor)  # 创建返回字典格式数据的游标

            # 1. 获取电影总数
            cursor.execute("SELECT COUNT(*) as count FROM movies")  # 执行SQL查询统计电影总数
            total_movies = cursor.fetchone()['count']  # 获取查询结果

            # 2. 获取平均评分
            cursor.execute("""
                SELECT ROUND(AVG(CAST(rating AS DECIMAL(3,1))), 1) as avg_rating 
                FROM movies 
                WHERE rating IS NOT NULL AND rating != ''
            """)  # 执行SQL查询计算平均评分，保留一位小数
            avg_rating = cursor.fetchone()['avg_rating']  # 获取查询结果

            # 3. 获取国家/地区数（去重）
            cursor.execute("""
                SELECT COUNT(DISTINCT country) as count 
                FROM movies 
                WHERE country IS NOT NULL AND country != ''
            """)  # 执行SQL查询统计不同国家/地区数量
            total_countries = cursor.fetchone()['count']  # 获取查询结果

            # 4. 获取导演数量（去重）
            cursor.execute("""
                SELECT COUNT(DISTINCT director) as count 
                FROM movies 
                WHERE director IS NOT NULL AND director != ''
            """)  # 执行SQL查询统计不同导演数量
            total_directors = cursor.fetchone()['count']  # 获取查询结果

            # 组装统计数据
            stats = {
                'total_movies': total_movies,  # 电影总数
                'avg_rating': float(avg_rating) if avg_rating else 0,  # 平均评分，如果为空则设为0
                'total_countries': total_countries,  # 国家/地区数
                'total_directors': total_directors  # 导演数量
            }

            logger.info(f"获取到的统计数据: {stats}")  # 记录获取到的统计数据
            return stats  # 返回统计结果

        except Exception as e:  # 捕获所有可能的异常
            logger.error(f"获取统计数据时出错: {str(e)}")  # 记录错误信息
            logger.exception("详细错误信息:")  # 记录详细的异常堆栈
            return self.default_stats  # 发生错误时返回默认数据
        finally:  # 确保资源正确释放
            if cursor:
                cursor.close()  # 关闭数据库游标
            if conn:
                conn.close()  # 关闭数据库连接 